#!/usr/bin/env python

"""
$Id: $

Copyright (c) 2012-2012 OctaneLabs <dartagnham@gmail.com> (http://www.octanelabs.net/)
See the file 'doc/COPYING' for copying permission
"""

import getopt, sys
import string
import variaveis
import FSJ_TSK
from subprocess import *
import re

####
# Program info
####
MY_VERSION="0.1-dev"
BUILD_DATE="2012-03-12"

####
# Program Functions
####


####
# Util functions
####


####
# Main
####

def main():

    try:
        opts, args = getopt.getopt(sys.argv[1:], "hi:v:c:", ["help", "imagem=", "volnum=","check="])
    except getopt.GetoptError, err:
        # print help information and exit:
        sys.stderr.write(str(err))
        usage()
        sys.exit(2)


    lsImagem = ""
    lnVolNum = None
    llChecks = []
    llRelatorio = ["-" * 80, "FSJuicer - Verifica consistencia nos sistemas de arquivos",
		   MY_VERSION, 
		   "OctaneLabs - www.octanelabs.net",
		   "Tony Rodrigues - dartagnham no gmail.com",
		   "-" * 80]

    for o, a in opts:
	if o in ("-h", "--help"):
	    usage()
	    sys.exit()
	elif o in ("-i", "--imagem"):
	    lsImagem = a
	elif o in ("-v", "--volnum"):
	    lnVolNum = int(a)
	elif o in ("-c", "--check"):
	    llChecks = a.split(",")
	else:
	    error("opcao '"+o+"' invalida")

    if lsImagem == "":
	error('Entre com o nome da imagem forense')

    #mapeia os volumes existentes na imagem
    llVols = []
    llVols = FSJ_TSK.getTSKVolumes(lsImagem)
    
    #se indicou um volume especifico, usa somente ele na lista
    if lnVolNum != None:
	llVols = llVols[lnVolNum-1:lnVolNum]
	   
	
    #Para cada offset na lista
    for lnOffSet in llVols:
	#Verifica o volume pelo fsstat
	lsFS = FSJ_TSK.getTSKFSInfo(lsImagem, lnOffSet)
	    
	#Se o file system for suportado:
	if lsFS == "NTFS":
	    #Lista de consistencia sera tudo desse file system ou o que foi passado pelo -c
	    if llChecks == []:
		llChecks = [1,2,3,4,5]
		    
	    #Para cada consistencia na lista:
	    for lnCrit in llChecks:
		if lnCrit == 1:
		    #Criterio 1: xxxxxx
		    
		    #Recupera pelo ifind o inode do item verificado
		    lsInode = FSJ_TSK.getTSKInode(lsImagem, lnOffSet, r'$MFT')
		    
		    #Recupera o item verificado com icat
		    lsDados = FSJ_TSK.getTSKDados(lsImagem, lnOffSet, lsInode)
		    
		    #Faz o parsing da estrutura
		    #Executa correlacao
		    #Salva o resultado
		    llRelatorio.append("Verificacao do $MFT")
		    llRelatorio.append("****** OK *********")
		    
		
    for i in llRelatorio:
	print i
	
    sys.exit(0)

    


def usage():

	print "\n"
	print "usage: FSJuicer.py -i <imagem-forense> [ -v <numero-volume> ] [-c <lista-de-verificacao>] [-h]";

def error(errorMsg, fatal=True, showUsage=True):
	
	sys.stderr.write(errorMsg+"\n")
	if showUsage:
		usage()
	if fatal:
		sys.exit(2)
	
if __name__ == "__main__":
    main()
